#include <grass/sqlp.h>

#define DBF_COL_NAME 20 /* maximum column name (in fact shouldn't be > 10) */

/* 
* DBF API:      http://shapelib.maptools.org/dbf_api.html
*            or ../../../lib/external/shapelib/shapefil.h
*
* DBFFieldType: FTString, FTInteger, FTDouble, FTLogical, FTInvalid
*                  0          1          2         4         5
*                DBF_CHAR   DBF_INT   DBF_DOUBLE
*                  1          2          3
*/
#define DBF_CHAR   1
#define DBF_INT    2
#define DBF_DOUBLE 3

typedef struct {
    char name[DBF_COL_NAME]; 
    int  type; 
    int  width; 
    int  decimals; 
} COLUMN;

typedef struct {
    char  *c; 
    int    i; 
    double d; 
    int    is_null;
} VALUE;

typedef struct {
    int   alive; 
    VALUE *values;
} ROW;

typedef struct {
    char  name[1024]; /* table name (without .dbf) */
    char  file[1024]; /* full path to file (including .dbf) */
    int   read;       /* TRUE if user has read access to the file */  
    int   write;      /* TRUE if user has write access to the file */
    int   alive; 
    int   described;  /* columns definitions were loaded to heads */
    int   loaded;     /* data were loaded to rows */
    int   updated;     
    COLUMN *cols;
    ROW  *rows;
    int   acols;      /* allocated columns */
    int   ncols;      /* number of columns */
    int   arows;      /* allocated rows */
    int   nrows;      /* number of rows */
} TABLE;

typedef struct {
    char   name[1024]; /* db name = full path to db dir */
    TABLE *tables;
    int    atables;    /* allocated space for tables */
    int    ntables;    /* number of tables */
} DATABASE;

/* cursors */
typedef struct {
    SQLPSTMT *st;
    int table;   /* table */
    int *set;    /* array of indexes to table for selected rows */
    int nrows;   /* number of rows in set */
    int cur;     /* position of cursor */
    int *cols;   /* array of indexes of selected columns */
    int ncols;
    dbToken token;
    int type;    /* type of cursor: SELECT, UPDATE, INSERT */
    int *order;  /* array of row indexes (sorted by ORDER BY) */
} cursor;

#ifdef MAIN
    DATABASE db;
    dbString *errMsg = NULL;
#else
    extern DATABASE db;
    extern dbString *errMsg;
#endif 

